package com.dubbo.test.redisson;

import org.redisson.Redisson;
import org.redisson.api.RLock;

import java.util.concurrent.TimeUnit;

/**
 * Created by Administrator on 2020/6/27 0027.
 * 分布式锁-redis  多节点，多台机器、确保同一时刻只有一个线程执行。其他阻塞 等待唤醒
 *  zj：会话获取 config -> Redisson.create(config)
 *       获取锁  redisson.getLock(key) 锁超时__mylock.lock(10, TimeUnit.MINUTES)
 *       释放锁  mylock.unlock()
 */

public class DistributedRedisLock {
    //从配置类中获取redisson对象
    private static Redisson redisson = RedissonManager.getRedisson();
    private static final String LOCK_TITLE = "redisLock_";
    //加锁
    public static boolean acquire(String lockName){
        //声明key对象
        String key = LOCK_TITLE + lockName;
        //获取锁对象
        RLock mylock = redisson.getLock(key);
        //加锁，并且设置锁过期时间，防止死锁的产生
        mylock.lock(10, TimeUnit.MINUTES);
        System.err.println("======lock======"+Thread.currentThread().getName());
        //加锁成功
        return  true;
    }
    //锁的释放
    public static void release(String lockName){
        //必须是和加锁时的同一个key
        String key = LOCK_TITLE + lockName;
        //获取所对象
        RLock mylock = redisson.getLock(key);
        //释放锁（解锁）
        mylock.unlock();
        System.err.println("======unlock======"+Thread.currentThread().getName());
    }

//    public static void main1(String[] args) {
//        String key = "user-id";
//        //加锁
//        DistributedRedisLock.acquire(key);
//        //执行具体业务逻辑
//        System.out.println("----");
//        //释放锁
//        DistributedRedisLock.release(key);
//    }
}
